es聚合报错Elasticsearch exception [type=search

您所在的位置:网站首页 opengl红宝书 最新 es聚合报错Elasticsearch exception [type=search

es聚合报错Elasticsearch exception [type=search

2023-04-08 20:27| 来源: 网络整理| 查看: 265

Exception in thread "main" ElasticsearchStatusException[Elasticsearch exception [type=search_phase_execution_exception, reason=all shards failed]]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=Fielddata is disabled on text fields by default. Set fielddata=true on [content_type] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.]]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=Fielddata is disabled on ext fields by default. Set fielddata=true on [content_type] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.]]; 这个原因是因为我的分组聚合查询的字符串(content_type)类型是text类型 img 原因分析:

当使用到term 查询的时候,由于是精准匹配,所以查询的关键字在es上的类型,必须是keyword而不能是text,比如你的搜索条件是 ”name”:”蔡虚坤”,那么该name 字段的es类型得是keyword,而不能是text

在es中,只有keyword类型的字符串可以使用AggregationBuilders.terms(“aggs-class”)来分组聚合,想要分组查询,指定根据分组字段的keyword属性就可以了(如下图);

img

在我们的Java代码中怎么修改呢如下,加上".keyword"就可以了

img

之前的报错下面追加上:

img

img 我的解决方案:

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //queryAll QueryBuilder queryAll = QueryBuilders.matchAllQuery(); RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("timestamp").gte(fordControlListReq.getStartTime()).lte(fordControlListReq.getEndTime()).format("epoch_millis"); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(queryAll).must(rangeQueryBuilder); searchSourceBuilder.query(boolQueryBuilder); searchSourceBuilder.size(1000); searchSourceBuilder.sort("timestamp", SortOrder.DESC); AggregationBuilder calSum2 = AggregationBuilders.cardinality("phoneNum").field("phoneNum.keyword"); AggregationBuilder aggregationBuilder = AggregationBuilders.dateHistogram("date_histogram") .field("timestamp") .interval(JdDateUtil.calInterval(fordControlListReq.getStartTime(),fordControlListReq.getEndTime())) .timeZone(DateTimeZone.getDefault()).subAggregation(calSum2); searchSourceBuilder.aggregation(aggregationBuilder); //执行查询 SearchRequest searchRequest = new SearchRequest("app_api_request_log", "").source(searchSourceBuilder); SearchResponse response = null;

AggregationBuilders.cardinality(“phoneNum”).field(“phoneNum.keyword”);



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3